/**
 * 角色权限检查组件
 * 用于根据当前用户角色控制内容显示
 */

const { testHelper } = require('../../../helpers/index.js');
const roleConfig = require('../../../../miniprogram/projects/oa/config/research_role_config.js');

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    // 要检查的角色，多个角色用逗号分隔
    roles: {
      type: String,
      value: ''
    },
    
    // 要检查的权限
    permission: {
      type: String,
      value: ''
    },
    
    // 要检查的事件权限
    event: {
      type: String,
      value: ''
    },
    
    // 显示模式：show(默认)、hide
    mode: {
      type: String,
      value: 'show'
    },
    
    // 测试模式下是否始终显示
    showInTestMode: {
      type: Boolean,
      value: false
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    // 显示内容
    show: false,
    // 调试模式下强制显示
    forceShow: false
  },
  
  /**
   * 组件生命周期
   */
  lifetimes: {
    attached() {
      this.checkPermission();
    }
  },
  
  /**
   * 属性变化监听
   */
  observers: {
    'roles, permission, event, mode, showInTestMode': function() {
      this.checkPermission();
    }
  },

  /**
   * 组件的方法列表
   */
  methods: {
    /**
     * 检查权限并决定是否显示内容
     */
    checkPermission() {
      // 获取当前用户角色
      const currentRole = testHelper.getCurrentRole();
      
      // 检查是否在测试模式下
      const isTestMode = testHelper.isDebugModeEnabled();
      
      // 测试模式下的处理
      if (isTestMode && this.data.showInTestMode) {
        this.setData({
          show: true,
          forceShow: true
        });
        return;
      }
      
      let hasPermission = false;
      
      // 检查角色权限
      if (this.data.roles) {
        const roleList = this.data.roles.split(',').map(r => r.trim());
        hasPermission = testHelper.hasAnyRole(roleList);
      }
      
      // 检查功能权限
      if (!hasPermission && this.data.permission) {
        hasPermission = testHelper.hasPermission(this.data.permission);
      }
      
      // 检查事件权限
      if (!hasPermission && this.data.event) {
        hasPermission = roleConfig.hasEventPermission(currentRole, this.data.event);
      }
      
      // 根据模式决定是否显示
      const shouldShow = this.data.mode === 'show' ? hasPermission : !hasPermission;
      
      this.setData({
        show: shouldShow,
        forceShow: false
      });
      
      // 触发权限变化事件
      this.triggerEvent('permissionChange', {
        hasPermission: hasPermission,
        show: shouldShow,
        role: currentRole
      });
    }
  }
}) 